import auth from '@/plugins/auth'
import router, { constantRoutes, dynamicRoutes } from '@/router'
import { type RouteRecordRaw } from 'vue-router'
// import { getRouters } from '@/api/menu'
import Layout from '@/layout/index.vue'
import ParentView from '@/components/ParentView/index.vue'
import InnerLink from '@/layout/components/InnerLink/index.vue'

// 匹配views里面所有的.vue文件
const modules = import.meta.glob('./../../views/**/*.vue')

interface IPermission {
  routes: RouteRecordRaw[]
  addRoutes: RouteRecordRaw[]
  defaultRoutes: RouteRecordRaw[]
  topbarRouters: RouteRecordRaw[]
  sidebarRouters: RouteRecordRaw[]
}

const usePermissionStore = defineStore('permission', {
  state: (): IPermission => ({
    routes: [],
    addRoutes: [],
    defaultRoutes: [],
    topbarRouters: [],
    sidebarRouters: [],
  }),
  actions: {
    setRoutes(routes: RouteRecordRaw[]) {
      this.addRoutes = routes
      this.routes = constantRoutes.concat(routes)
    },
    setDefaultRoutes(routes: RouteRecordRaw[]) {
      this.defaultRoutes = constantRoutes.concat(routes)
    },
    setTopbarRoutes(routes: RouteRecordRaw[]) {
      this.topbarRouters = routes
    },
    setSidebarRouters(routes: RouteRecordRaw[]) {
      this.sidebarRouters = routes
    },
    async generateRoutes() {
      return await new Promise((resolve) => {
        // 假装请求路由成功
        const sdata = JSON.parse(JSON.stringify(dynamicRoutes))
        const rdata = JSON.parse(JSON.stringify(dynamicRoutes))
        const defaultData = JSON.parse(JSON.stringify(dynamicRoutes))
        const sidebarRoutes = filterAsyncRouter(sdata)
        const rewriteRoutes = filterAsyncRouter(rdata, undefined, true)
        const defaultRoutes = filterAsyncRouter(defaultData)
        const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
        asyncRoutes.forEach((route) => {
          router.addRoute(route)
        })
        this.setRoutes(rewriteRoutes)
        this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
        this.setDefaultRoutes(sidebarRoutes)
        this.setTopbarRoutes(defaultRoutes)
        resolve(rewriteRoutes)
        // 向后端请求路由数据
        // getRouters().then((res) => {
        //   const sdata = JSON.parse(JSON.stringify(res.data))
        //   const rdata = JSON.parse(JSON.stringify(res.data))
        //   const defaultData = JSON.parse(JSON.stringify(res.data))
        //   const sidebarRoutes = filterAsyncRouter(sdata)
        //   const rewriteRoutes = filterAsyncRouter(rdata, false, true)
        //   const defaultRoutes = filterAsyncRouter(defaultData)
        //   const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
        //   asyncRoutes.forEach((route) => {
        //     router.addRoute(route)
        //   })
        //   this.setRoutes(rewriteRoutes)
        //   this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
        //   this.setDefaultRoutes(sidebarRoutes)
        //   this.setTopbarRoutes(defaultRoutes)
        //   resolve(rewriteRoutes)
        // })
      })
    },
  },
})

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(
  asyncRouterMap: RouteRecordRaw[],
  _lastRouter?: RouteRecordRaw,
  type = false
): RouteRecordRaw[] {
  return asyncRouterMap.filter((route: RouteRecordRaw | any) => {
    if (type && route.children) {
      route.children = filterChildren(route.children)
    }
    if (route.component) {
      // Layout ParentView 组件特殊处理
      if (route.component === 'Layout') {
        route.component = Layout
      } else if (route.component === 'ParentView') {
        route.component = ParentView
      } else if (route.component === 'InnerLink') {
        route.component = InnerLink
      } else {
        route.component = loadView(route.component)
      }
    }
    if (route.children?.length) {
      route.children = filterAsyncRouter(route.children, route, type)
    } else {
      delete route.children
      delete route.redirect
    }
    return true
  })
}

function filterChildren(childrenMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw): RouteRecordRaw[] {
  let children: RouteRecordRaw[] = []
  childrenMap.forEach((el: RouteRecordRaw | any, index) => {
    if (el.children?.length) {
      if (el.component === 'ParentView' && lastRouter == null) {
        el.children.forEach((c: any) => {
          c.path = `${el.path as string}/${c.path as string}`
          if (c.children?.length) {
            children = children.concat(filterChildren(c.children, c))
            return
          }
          children.push(c)
        })
        return
      }
    }
    if (lastRouter != null) {
      el.path = `${lastRouter.path}/${el.path as string}`
    }
    children = children.concat(el)
  })
  return children
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes: RouteRecordRaw[]): RouteRecordRaw[] {
  const res: RouteRecordRaw[] = []
  routes.forEach((route) => {
    if (route.permissions != null) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route)
      }
    } else if (route.roles != null) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route)
      }
    }
  })
  return res
}
// 加载页面
export const loadView = (view: string): (() => Promise<unknown>) | undefined => {
  let res
  for (const path in modules) {
    const dir = path.split('views/')[1].split('.vue')[0]
    if (dir === view) {
      res = async () => await modules[path]()
    }
  }
  return res
}

export default usePermissionStore
